package com.example.module_mvvm.view

import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.EditText
import android.widget.ListView
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import com.example.module_mvvm.R
import com.example.module_mvvm.bean.UserBean
import com.example.module_mvvm.viewmodel.UserViewModel

/**
 * 逐行分析：
 * - ViewModelProvider 用于获取 ViewModel 实例。
 * - observe() 方法注册一个观察者，当 LiveData 数据变化时会自动回调。
 * - loadUser() 触发数据加载，进而更新 UI。
 * 优点
 *   1. 结构清晰，职责划分清晰
 *   2. 模块间充分解耦
 *   3. 在 MVP 的基础上，MVVM 把 View 和 ViewModel 也进行了解耦
 * 缺点：
 *   1. Debug 困难，由于 View 和 ViewModel 解耦，导致 Debug 时难以一眼看出 View 的事件传递
 *   2. 代码复杂性增大
 */
class MvvmActivity : AppCompatActivity() {

    private lateinit var viewModel: UserViewModel
    private lateinit var adapter: ArrayAdapter<UserBean>

    private lateinit var etUserName: EditText
    private lateinit var btnAddUser: Button
    private lateinit var lvUsers: ListView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_mvvm)

        // 初始化ViewModel
        // 创建ViewModelProvider实例
        // ViewModelProvider 是一个"ViewModel工厂"
        viewModel = ViewModelProvider(this)[UserViewModel::class.java]

        initViews()
        setupListView()
        setupObservers()
    }

    private fun initViews() {
        etUserName = findViewById(R.id.etUserName)
        btnAddUser = findViewById(R.id.btnAddUser)
        lvUsers = findViewById(R.id.lvUsers)

        btnAddUser.setOnClickListener {
            val name = etUserName.text.toString()
            viewModel.addUser(name)
        }
    }

    private fun setupListView() {
        adapter = object : ArrayAdapter<UserBean>(
            this,
            android.R.layout.simple_list_item_1,
            mutableListOf()
        ) {
            override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
                val view = super.getView(position, convertView, parent)
                val text = view.findViewById<TextView>(android.R.id.text1)
                text.text = getItem(position)?.name
                return view
            }
        }
        lvUsers.adapter = adapter
    }

    private fun setupObservers() {
        // 观察用户列表数据
        viewModel.users.observe(this) { users ->
            adapter.clear()
            adapter.addAll(users)
            adapter.notifyDataSetChanged()
        }

        // 观察错误消息
        viewModel.errorMessage.observe(this) { message ->
            if (message.isNotEmpty()) {
                Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
                viewModel.onErrorMessageShown()
            }
        }

        // 观察清空输入框事件
        viewModel.clearInput.observe(this) { shouldClear ->
            if (shouldClear) {
                etUserName.setText("")
                viewModel.onClearInputHandled()
            }
        }
    }


}

